//
//  ZXY_MOMOOperation.h
//  Lover_BridgeiOS
//
//  Created by 宇周 on 15/12/1.
//  Copyright © 2015年 宇周. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>


/**
 *  该类帮助操作数据库，存储的数据格式 为字典
 */
@interface ZXY_MOMOOperation : NSObject
// MARK: 数据库单个数据的增删改查
/**
 *  数据库存储
 *
 *  @param modalName  modal的名字
 *  @param dataDic    需要存储的数据
 *  @param reflectDic 映射字断 如 modal Person 的字断 为person_name 而 字典中对应的为 name,
 *                                 {name:person_name}为一 种映射关系
 *
 *  @return 成功与否
 */
    + (BOOL)saveModel:(NSString *)modalName
          WithSaveDic:(NSDictionary *)dataDic
        andReflectDic:(NSDictionary *)reflectDic;

/**
 *  保存数据，如果在数据库中找到能够匹配的数据，会吊用findIt，并将context 和 查找到的数据传递
 *
 *  @param modalName  modal 名字
 *  @param dataDic    需要存储的数据
 *  @param reflectDic 映射字断
 *  @param format     需要进行匹配的条件
 *  @param findIt     匹配条件满足的情况下，会调用该方法，返回值表示是否继续存储，YES继续存储，NO不再存储
 *
 *  @return 返回存储结果
 */
    + (BOOL)saveModel:(NSString *)modalName
          WithSaveDic:(NSDictionary *)dataDic
        andReflectDic:(NSDictionary *)reflectDic
    withPredictFormat:(NSString *)format
         ifExistBlock:(BOOL (^)(NSManagedObjectContext *ctx, NSArray *mobs)) findIt;

/**
 *  根据指定条件删除数据
 *
 *  @param modalName modal 名字
 *  @param predict   条件
 *
 *  @return 返回结果
 */
+ (BOOL)deleteModel:(NSString *)modalName
        withPredict:(NSString *)predict;


/**
 *  更新数据
 *
 *  @param modalName  modal 名字
 *  @param dataDic    新的数据
 *  @param reflectDic 字断映射
 *  @param format     查找条件
 *
 *  @return 更新结果
 */
    + (BOOL)updateModel:(NSString *)modalName
            withSaveDic:(NSDictionary *)dataDic
          andReflectDic:(NSDictionary *)reflectDic
      withPredictFormat:(NSString *)format;


/**
 *  查找数据
 *
 *  @param modalName modal的名字
 *  @param predict   查找条件
 *
 *  @return 返回查找结果
 */
    + (NSArray *)findModels:(NSString *)modalName
               withPredict:(NSString *)predict;

// MARK: 对复杂数据结构的操作

/**
 *  用来保存一组数据
 *
 *  @param modalName  模型名称
 *  @param listArr    要保存的数组 [dic1 , dic2]
 *  @param reflectDic 映射关系
 *
 *  @return 保存成功返回YES
 */
    + (BOOL)saveModels:(NSString *)modalName
          withSaveList:(NSArray *)listArr
        withReflectDic:(NSDictionary *)reflectDic;


/**
 *  保存一组数组
 *
 *  @param modalName  模型名称
 *  @param listArr    需要保存的数组[dic1 , dic2]
 *  @param reflectDic 模型的映射关系
 *  @param format 对应的查找条件
 *  @param autoIndex 设置为YES 对所有数据使用第一个查找条件
 *  @param findIt     如果找到与条件匹配的项目所执行的操作，返回值表示是否继续对该条数据存储
 *
 *  @return 返回结果
 */
    + (BOOL)saveModels:(NSString *)modalName
          withSaveList:(NSArray *)listArr
        withReflectDic:(NSDictionary *)reflectDic
        andFindPredict:(NSArray<NSString *> *)format
           autoIndexes:(BOOL)autoIndex
            whenFindIt:(BOOL (^)(NSManagedObjectContext * , NSArray *)) findIt;

/**
 *  一个模型是否存在
 *
 *  @param modalName modal的名字
 *  @param predict   查找条件
 *
 *  @return 存在返回true否则false
 */
    + (BOOL)modelExists:(NSString *)modalName
            withPredict:(NSString *)predict;



@end

@interface ZXY_MOMOOperation(AS_RETURN_MODAL)
+ (NSManagedObject *)saveModel:(NSString *)modalName
      WithSaveDic:(NSDictionary *)dataDic
    andReflectDic:(NSDictionary *)reflectDic;
+ (NSArray *)updateModel:(NSString *)modalName
        withSaveDic:(NSDictionary *)dataDic
      andReflectDic:(NSDictionary *)reflectDic
  withPredictFormat:(NSString *)format;
@end
